package com.operator.Activitys.activity;

import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.alipay.sdk.app.PayTask;
import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.bean.MoneyState;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.dialog.MyBottomDialog;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.LogUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.operator.Activitys.utils.UiUtil;
import com.operator.Activitys.zhifubao.AuthResult;
import com.operator.Activitys.zhifubao.OrderInfoUtil;
import com.operator.Activitys.zhifubao.PayResult;
import com.zhy.autolayout.AutoRelativeLayout;

import org.simple.eventbus.EventBus;
import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.util.Map;

import butterknife.Bind;
import butterknife.OnClick;
import me.curzbin.library.BottomDialog;
import me.curzbin.library.Item;
import me.curzbin.library.OnItemClickListener;

/**
 * 项目名称：金泽云 手机app
 * 类描述：充值页面
 * 创建人：张飞祥
 * 创建时间：2018/5/23 10:52
 * 修改人：张飞祥
 * 修改时间：2018/5/23 10:52
 * 修改备注：
 */
public class RechargeActivity extends BaseActivity implements TextWatcher, View.OnFocusChangeListener {

    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //功能键
    @Bind(R.id.tv_function)
    TextView tvFunction;
    //标题总布局
    @Bind(R.id.app_bar_layout)
    AutoRelativeLayout appBarLayout;
    //充值 300
    @Bind(R.id.et_recharge_300)
    EditText etRecharge300;
    //充值 500
    @Bind(R.id.et_recharge_500)
    EditText etRecharge500;
    //充值 1000
    @Bind(R.id.et_recharge_1000)
    EditText etRecharge1000;
    //充值 2000
    @Bind(R.id.et_recharge_2000)
    EditText etRecharge2000;
    //充值 其他数量
    @Bind(R.id.et_recharge_other_number)
    EditText etRechargeOtherNumber;


    //充值金额
    private int mRechargeMoney;
    //初始化网络请求
    public UserManager mApiManager;
    //TODO 当前 内存中 用户信息
    private User mACacheUser = null;
    //支付方式
    private String mPayType = "";

    @Override
    protected void initUI() {
        setContentView(R.layout.act_recharge);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(this,this.getTaskId());
        //TODO 获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);

        //设置标题
        tvTitle.setText("充值");
        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //显示功能按钮
        tvFunction.setVisibility(View.VISIBLE);
        //显示功能按钮 文字
        tvFunction.setText("充值记录");
        //设置状态栏 背景颜色
        appBarLayout.setBackgroundResource(R.color.color_bg_blue);
    }

    @Override
    protected void initData() {
        //金额数量按钮点击事件
        initRechargeFocusListener();
        //金额其他数量 文字输入监听 事件
        etRechargeOtherNumber.addTextChangedListener(this);
    }

    /**
     * 充值金额 按钮点击事件
     */
    private void initRechargeFocusListener() {
        //50 金币  焦点监听
        etRecharge300.setOnFocusChangeListener(this);
        //100 金币 焦点监听
        etRecharge500.setOnFocusChangeListener(this);
        //300 金币 焦点监听
        etRecharge1000.setOnFocusChangeListener(this);
        //500 金币 焦点监听
        etRecharge2000.setOnFocusChangeListener(this);
        //其他金币 焦点监听
        etRechargeOtherNumber.setOnFocusChangeListener(this);
    }

    /**
     * 焦点事件监听
     */
    @Override
    public void onFocusChange(View view, boolean b) {
        //TODO 隐藏其他数量 软件盘
        UiUtil.hideKeyboard(etRechargeOtherNumber, RechargeActivity.this);
        //TODO 清空 其他数量 值
        etRechargeOtherNumber.setText("");
        //TODO 焦点监听判断
        switch (view.getId()){
            case R.id.et_recharge_300:
                //设置 充值金额
                mRechargeMoney = 300;
                //设置始终不显示软件盘
                etRecharge300.setInputType(InputType.TYPE_NULL);
                break;
            case R.id.et_recharge_500:
                //设置 充值金额
                mRechargeMoney = 500;
                //设置始终不显示软件盘
                etRecharge500.setInputType(InputType.TYPE_NULL);
                break;
            case R.id.et_recharge_1000:
                //设置 充值金额
                mRechargeMoney = 1000;
                //设置始终不显示软件盘
                etRecharge1000.setInputType(InputType.TYPE_NULL);
                break;
            case R.id.et_recharge_2000:
                //设置 充值金额
                mRechargeMoney = 2000;
                //设置始终不显示软件盘
                etRecharge2000.setInputType(InputType.TYPE_NULL);
                break;
            case R.id.et_recharge_other_number:
                if (etRechargeOtherNumber.getText().equals("")){
                    //初始化 充值金额
                    mRechargeMoney = 0;
                }
                break;
        }
    }

    /**
     * 金币其他数量监听事件
     */
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        //TODO 判断当前 显示的具体价格
        if (!charSequence.toString().equals("")) {
            //设置 充值金额
            mRechargeMoney = Integer.valueOf(charSequence.toString());
        }else {
            //初始化 充值金额
            mRechargeMoney = 0;
        }
    }
    @Override
    public void afterTextChanged(Editable editable) {
    }

    /**
     * 按钮点击事件
     */
    @OnClick({R.id.iv_return,R.id.tv_function,R.id.btn_recharge})
    public void onBtnClick(View v) {
        switch (v.getId()) {

            case R.id.iv_return:            //返回
                finish();
                break;

            case R.id.tv_function:          //充值记录
                JumperUtils.JumpTo(this,RechargeListActivity.class);
                break;

            case R.id.btn_recharge:         //充值

                //TODO 隐藏其他数量 软件盘
                UiUtil.hideKeyboard(etRechargeOtherNumber, RechargeActivity.this);
                //TODO 开始业务逻辑判断
                if (mRechargeMoney == 0){
                    ToastUtils.showShort(RechargeActivity.this,"请输入充值金额！");
                }else{
                    //TODO 判断是否被冻结
                    if (Constant.SHOP_STATE_YES.equals(mACacheUser.getState()))
                        initHttpRecharge();
                    else
                        ToastUtils.showShort(RechargeActivity.this, getResources().getString(R.string.shop_state_no));
                }
                break;
        }
    }

    /**
     * 开始充值
     */
    private void initHttpRecharge() {
        new MyBottomDialog(this)
                .title(R.string.pay_title)              //设置标题
                .layout(BottomDialog.GRID)              //设置内容layout,默认为线性(LinearLayout)
                .orientation(BottomDialog.VERTICAL)     //设置滑动方向,默认为横向
                .inflateMenu(R.menu.menu_pay)           //传人菜单内容
                .itemClick(new OnItemClickListener() {  //设置监听
                    @Override
                    public void click(Item item) {
                        //判断 支付方式
                        if (item.getId() == R.id.pay_mode_wechat) {
                            mPayType = "微信";
                            ToastUtils.showShort(RechargeActivity.this,"暂未开通微信支付！！");
                        }else {
                            mPayType = "支付宝";
                            //调用 支付宝 支付
                            initPayZhiFuBao();
                        }
                    }
                }).show();
    }

    /**
     * 支付宝支付
     */
    private void initPayZhiFuBao() {

        /**
         * 传入 商品 订单信息，开启支付
         */
        boolean rsa2 = (Constant.PAY_AUTH_PRIVATE_KEY.length() > 0);
        Map<String, String> params = OrderInfoUtil.buildOrderParamMap
                (Constant.PAY_AUTH_APP_ID,String.valueOf(System.currentTimeMillis()),"充值",
                        "店铺余额充值", mRechargeMoney+"", rsa2);

        String orderParam = OrderInfoUtil.buildOrderParam(params);

        String privateKey = rsa2 ? Constant.PAY_AUTH_PRIVATE_KEY : Constant.PAY_AUTH_PUBLIC_KEY;

        String sign = OrderInfoUtil.getSign(params, privateKey, rsa2);
        final String orderInfo = orderParam + "&" + sign;

        //TODO 获取 当前 支付结果
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {

                PayTask alipay = new PayTask(RechargeActivity.this);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());

                Message msg = new Message();
                msg.what = Constant.SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    /**
     * 支付宝 支付结果消息接收
     */
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constant.SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果，请商户依赖服务端的异步通知结果。同步通知结果，仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();

                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        //网络请求 提交支付 信息
                        initHttpPaySubmit();
                    } else {
                        // 该笔订单真实的支付结果，需要依赖服务端的异步通知。
                        ToastUtils.showShort(RechargeActivity.this,"支付失败");

                        LogUtils.e("Pay:---------->"+resultInfo);
                        LogUtils.e("Pay:---------->"+resultStatus);
                    }
                    break;
                }
                case Constant.SDK_AUTH_FLAG: {
                    @SuppressWarnings("unchecked")
                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                    String resultStatus = authResult.getResultStatus();

                    // 判断resultStatus 为“9000”且result_code
                    // 为“200”则代表授权成功，具体状态码代表含义可参考授权接口文档
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 获取alipay_open_id，调支付时作为参数extern_token 的value
                        // 传入，则支付账户为该授权账户
                        ToastUtils.showShort(RechargeActivity.this,"授权成功" + String.format("authCode:%s", authResult.getAuthCode()));
                    } else {
                        // 其他状态值则为授权失败
                        ToastUtils.showShort(RechargeActivity.this,"授权失败" + String.format("authCode:%s", authResult.getAuthCode()));
                    }
                    break;
                }
                default:
                    break;
            }
        };
    };


    /**
     * 极光推送 店铺 冻结结果
     */
    @Subscriber(tag = Constant.BUS_JPUSH_SHOP_FROZEN_TAG)
    public void onJpushShopFrozenTag(String pushTag) {
        mACacheUser.setState(pushTag);
    }

    /**
     * 提交 充值 金额 变更信息
     */
    private void initHttpPaySubmit(){
        //TODO 弹出 Dialog
        initShowTimeDialog("正在提交充值信息，请稍候...",RechargeActivity.this);
        //TODO 开始网络请求
        mApiManager.userRecharge(mACacheUser.getId(),mRechargeMoney,mPayType);
    }

    /**
     * 充值 报错
     */
    @Subscriber(tag = Constant.BUS_MY_RECHARGE_ERROR, mode = ThreadMode.MAIN)
    public void initRechargeError(String httpRechargeError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏加载
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(RechargeActivity.this,"充值信息提交失败，网络连接不稳定！");
            }
        }, 1000);
    }

    /**
     * 充值 返回数据
     */
    @Subscriber(tag = Constant.BUS_MY_RECHARGE, mode = ThreadMode.MAIN)
    public void initRecharge(final MoneyState state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏加载
                timeDialog.dismiss();
                //TODO 业务逻辑判断
                if ("1".equals(state.getState())){
                    //保存新的 用户余额参数
                    mACacheUser.setRemainder(state.getCurentRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mACacheUser));
                    //更新我的页面 余额
                    EventBus.getDefault().post(state.getCurentRemainder(),Constant.BUS_MY_REMAINDER);
                    //弹出相应的提示
                    initShowMsgDialog();
                }else{
                    //弹出提示
                    ToastUtils.showShort(RechargeActivity.this,state.getMsg());
                }
            }
        }, 1000);
    }

    /**
     * 显示提示dialog
     */
    public void initShowMsgDialog() {
        //提示 dialog
        MaterialDialog mMsgDialog = new MaterialDialog.Builder(this)
                .title("充值成功！")
                .content("您已充值成功，是否继续充值？")
                .negativeText("不了，谢谢！")
                .negativeColor(Color.parseColor("#cccccc"))
                .positiveText("继续充值")
                .onNegative(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        finish();
                    }
                }).show();
        // 设置点击屏幕Dialog不消失
        mMsgDialog.setCanceledOnTouchOutside(false);
        //取消Back键监听
        mMsgDialog.setCancelable(false);
    }

}
